﻿#ifndef BLOG_EVENT_HANDLER_H
#define BLOG_EVENT_HANDLER_H

#include <QObject>
#include <service/event/ctkEventHandler.h>

/*
CTK框架中的事件监听，即观察者模式流程上是这样：

接收者注册监听事件->发送者发送事件->接收者接收到事件并响应；

相比调用插件接口，监听事件插件间依赖关系更弱，不用指定事件的接收方和发送方是谁。
*/

// 事件处理程序（或订阅者）：调用者可以改成接口、加多个实现类形式。
// 继承handleEvent，实现ctkEventHandler接口handleEvent。
class BlogEventHandler : public QObject, public ctkEventHandler
{
    Q_OBJECT
    Q_INTERFACES(ctkEventHandler)

public:
    // 处理事件，直接在头文件做处理（也可以定义一个接口）。
    /*
    具体来说，当你的BlogEventHandler插件启动时，start 方法会被调用，并且其中的注册服务操作会将你的 BlogEventHandler 实例注册到事件管理器中。
    然后，如果有事件符合你设置的主题和过滤器条件，事件管理器会调用 handleEvent 方法，
    将事件传递给你的 BlogEventHandler 实例进行处理。

    因此，是的，当事件符合指定条件时，事件管理器会自动调用 handleEvent 方法。
    */
    void handleEvent(const ctkEvent& event) Q_DECL_OVERRIDE
    {
        QString title = event.getProperty("title").toString();
        QString content = event.getProperty("content").toString();
        QString author = event.getProperty("author").toString();

        qDebug() << "EventHandler received the message, topic:" << event.getTopic()
                 << "properties:" << "title:" << title << "content:" << content << "author:" << author;
    }
};

#endif // BLOG_EVENT_HANDLER_H
